home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / forthcmp.zip / INTERUPT.4TH < prev    next >
Text File  |  1992-03-30  |  3KB  |  106 lines

  1. ( INTERRUPT HANDLING EXAMPLE                   08:59 11/16/85 )
  2.  
  3. \ THIS TEST PROGRAM INTERCEPTS "CONTROL-C"
  4. \   AND "CONTROL-BREAK" FROM THE KEYBOARD.
  5. \   IT ALSO SHOWS TRAPPING OF DIVISION BY ZERO.
  6.  
  7. \ STOP EXECUTION BY TYPING ANY KEY BUT "CONTROL-C" OR "CONTROL-
  8. \   BREAK"
  9.  
  10.  
  11. 256 MSDOS
  12. HEX
  13.  
  14. INCLUDE INTS
  15.  
  16.  
  17.  
  18. \ CONTROL-C HANDLER
  19. 0 0 IN/OUT
  20. : CC-HANDLER ." !!!CTRL-C!!! "  ;
  21.  
  22. 23 CONSTANT CC-INT  ( interrupt number )
  23.  
  24. L: CC-ENTRY ( actual interrupt handler )
  25.   ( save registers )
  26.   AX PUSH  BX PUSH  CX PUSH  DX PUSH  SI PUSH  DI PUSH
  27.   ES PUSHSEG  ( just in case we alter it )
  28.   CALL' CC-HANDLER  ( high level interrupt handler )
  29.   ( restore registers )
  30.   ES POPSEG 
  31.   DI POP  SI POP  DX POP  CX POP  BX POP  AX POP
  32.   IRET     FORTH
  33.  
  34.  
  35. \ CONTROL-BREAK HANDLER
  36. 20 ALLOT  HERE CONSTANT PARAMSTACK    \ our new stacks
  37. 20 ALLOT  HERE CONSTANT RETSTACK
  38. 2VARIABLE SS-SAVE            \ Stack segment save area
  39.  
  40. VARIABLE BREAK-SET
  41.  
  42. 0 0 IN/OUT
  43. : CB-HANDLER  BREAK-SET ON  ;
  44.  
  45. 1B CONSTANT CB-INT
  46.  
  47. L: CB-ENTRY ( actual interrupt handler )
  48.   ( save registers )
  49.     AX PUSH  DS PUSHSEG  AX CS <SEG  AX DS >SEG    \ save AX, DS, set DS
  50.     SS-SAVE [] SS <SEG  SP SS-SAVE 2+ [] MOV    \ save SS SP
  51.     AX SS >SEG PARAMSTACK # SP MOV            \ set SS,SP
  52.     BX PUSH  CX PUSH  DX PUSH  SI PUSH  DI PUSH    \ Save remaining
  53.     BP PUSH ES PUSHSEG 
  54.     RETSTACK # BP MOV                \ set BP
  55.     CALL' CB-HANDLER  ( high level interrupt handler )
  56.     ES POPSEG BP POP DI POP SI POP DX POP CX POP BX POP \ restore registers
  57.     SS-SAVE [] SS >SEG SS-SAVE 2+ [] SP MOV DS POPSEG  AX POP
  58.     IRET FORTH
  59.  
  60. \ Because this is a BIOS interupt, rather than an MS-DOS interupt,
  61. \ as CC-INT was, we have to set our data segment register, and 
  62. \ use new stacks with minimum impact on the DOS stack
  63.  
  64.  
  65. \  ZERO-DIVIDE TRAP HANDLER
  66. 0 CONSTANT /0-INT
  67.  
  68. L: /0-ENTRY  
  69.     0 # AX MOV  AX DX MOV ( return zero )
  70.     1 # BX MOV    ( FOR 80286 or 80386 which will restart instruction )
  71.     IRET    FORTH
  72.  
  73. \ Neither this interupt (which is a hardware trap) nor the
  74. \ CONTROL-BREAK interupt had better do any i/o since DOS is not
  75. \ reentrant!
  76.  
  77.  
  78. \ INTERUPT HANDLER DEMO
  79. 0 1 IN/OUT
  80. : KEY? ( like ?terminal, but returns keystroke if there is one)
  81.        ( this returns CONTROL-BREAK like no key has been hit )
  82.        ?TERMINAL IF KEY ELSE 0 THEN ;
  83.  
  84. 2VARIABLE /0-SAVE  ( we will want to save the vectors )
  85. 2VARIABLE CB-SAVE
  86.  
  87. DECIMAL
  88. : MAIN  
  89.     /0-INT get-handler /0-SAVE 2!        \ get and save old handlers
  90.     CB-INT get-handler CB-SAVE 2!
  91.     ?CS: CC-ENTRY CC-INT set-handler    \ set handlers to us
  92.     ?CS: CB-ENTRY CB-INT set-handler
  93.     ?CS: /0-ENTRY /0-INT set-handler
  94.     ." TYPE ANY KEY TO STOP, OR TYPE CONTROL-C OR BREAK" CR
  95.     BEGIN  10 0 DO
  96.         BREAK-SET @ IF BREAK-SET OFF ." *BREAK*"  THEN
  97.         10000 I / . LOOP
  98.         CR KEY? UNTIL
  99.     /0-SAVE 2@ /0-INT set-handler        \ restore handlers
  100.     ( We dont need to restore the control-C handler )
  101.     CB-SAVE 2@ CB-INT set-handler ;
  102.  
  103.  
  104. INCLUDE FORTHLIB
  105. END
  106.